# 用Python的语法规则来描述手机

# 类：用来描述一类事物的统称，那么对应的属性也是该类事物通用的属性和行为

class CellPhone:        # 类使用关键字class修饰，类名的命名选择使用大驼峰规则，每个单词的首字母大写
    brand = '未知'      # 类级属性，类级变量
    type = '未知'
    color = '未知'
    price = 0
    size = ()
    #.......... CPU，内存，像素。。。。。

    # 构造方法：当类进行实例化时，会自动调用的一个方法。在Python中，构造方法名称是固定的__init__
    def __init__(self, xengine):
        print("类正在被实例化.")
        self.window = '大大的天窗'       # 实例变量
        self.engine = xengine + 'Hello'         # 实例变量


    # self这个形式参数在类中是必须有的，但是名称可以任意，通常建议保持self
    # self用在类定义中，可以代替其实例来调用类的其他属性和方法。
    def call(self, phone):
        print(f"正在给{phone}打电话...")

    def play(self):
        print("正在用%s玩游戏..." % self.brand)
        print("self的地址是: %d" % id(self))
        print("实例变量engine的值是: %s" % self.engine)

    def send(self):
        print("正在发信息...")

    def knock(self):
        print("正在敲核桃...")

    def photo(self):
        print("正在拍照片...")


if __name__ == '__main__':
    # 类级变量，可以使用实例或类名来直接调用
    myphone = CellPhone('16缸7.0L')   # 此时，该行代码会自己调用__init__构造方法，如果构造方法有固定参数，则实例化时必须传参
    myphone.brand = '华为'
    print("通过实例调用类级变量：%s" % myphone.brand)
    print("通过类名调用类级变量：%s" % CellPhone.brand)

    print("通过实例调用实例变量：%s" % myphone.engine)
    # print("通过类名调用实例变量：%s" % CellPhone.engine)   # 不能通过类名来调用实例变量
    myphone.play()
    print("类CellPhone的内存地址是：%d" % id(CellPhone))


def instance():
    yourphone = CellPhone()
    myphone = CellPhone()
    hisphone = myphone      # = 号，不仅仅只是赋值，也可以赋地址

    print("类CellPhone的内存地址是：%d" % id(CellPhone))       # 地址1
    print("实例yourphone的内存地址是：%d" % id(yourphone))     # 地址2
    print("实例myphone的内存地址是：%d" % id(myphone))         # 地址3
    print("实例hisphone的内存地址是：%d" % id(hisphone))       # 地址3

    myphone.brand = '华为'
    hisphone.brand = '小米'
    yourphone.brand = '三星'
    print(myphone.brand)         # 小米
    print(hisphone.brand)        # 小米

    # is比较运算符比较两个对象的地址是否一致
    if hisphone is yourphone:      # 相同
        print("相同")
    else:
        print("不同")


    myphone.play()      # 正在用小米玩游戏
    yourphone.play()    # 正在用三星玩游戏



def invoke():
    CellPhone().call('13812345678')
    CellPhone().brand = "华为"
    print(CellPhone().brand)      # 未知

    a = CellPhone()
    a.call('15812345678')

    b = CellPhone()
    b.brand = '华为'

    c = CellPhone()
    print(c.brand)       # 未知

    # string = "Hello"
    # string.strip()

    print("================================")

    myphone = CellPhone()   # myphone就是一个CellPhone这类事物的实例，使用类名()可对其进行实例化。
    myphone.call('18812345678')
    myphone.brand = '华为'
    print(myphone.brand)     # 华为
    myphone.size = (17, 7, 1, 170)
    print(myphone.size)
    myphone.price = 3500

    hisphone = myphone
    print('他的手机品牌是：' + hisphone.brand)

    print("================================")

    yourphone = CellPhone()
    # yourphone.brand = '小米'
    print(yourphone.brand)
    # yourphone.price = 3000
    print(yourphone.price)


# 随堂练习：请利用Python的编程语言方式来描述一辆汽车Car
